#!/usr/bin/enr/python3
# -*- coding: utf-8 -*-
# -------------------------------
# @Author : hurong
# @File : 04dict_demo.py
# @Time : 2023/6/21 16:21
# -------------------------------

"""字典
1.无序的键值对的集合；2.字典用大括号{}包围；
3.每个键/值对之间用逗号分割；4.各个键与值之间用又给冒号分隔开；5.字典是动态的。

"""

"""创建字典"""
# 1. 大括号填充键值对
dct = {"name":"Harry Potter", "age":18}
print(type(dct),dct)    # <class 'dict'> {'name': 'Harry Potter', 'age': 18}
dct1 = {}
print(type(dct1),dct1)  # <class 'dict'> {}

# 2. 使用字典的构造方法
dct3 = dict()
print(type(dct3), dct3)
# <class 'dict'> {'name': 'emily', 'age': 18}
dct4 = dict([("name","emily"),("age",18)])
print(type(dct4), dct4)
# 3. 使用字典推导式
dct5 = {k:v for k,v in [("name","emily"),("age",18)]}
print(type(dct5), dct5) # <class 'dict'> {'name': 'emily', 'age': 18}

"""字典的使用：访问元素"""
# 访问元素：1.与字典也支持中括号记法[key]. 2.字典使用键来访问其关联的值。3.访问时对应的key必须姚存在。
dct6 = {'name':'Harry Potter', 'age':18}
print(dct6["age"])
# 2.访问一个不存在的键值
# print(dct6['hobby'])    # KeyError: 'hobby'

# 3. 插入新的键值对
dct6['hobby'] = 'Magic'
print(dct6) # {'name': 'Harry Potter', 'age': 18, 'hobby': 'Magic'}

# 4.修改键值
dct6['age'] = 22
print(dct6)

"""字典使用：嵌套字典；字典值可以是字典对象"""
dc = {'name':'Harry Potter', 'age':18, 'course':{'english':80,'math':99 }}
# 获取英语成绩
print(dc['course']['english'])
# 替换数学成绩
dc['course']['math'] =100
# {'name': 'Harry Potter', 'age': 18, 'course': {'english': 80, 'math': 100}}
print(dc)

"""字典方法
keys()
values()
items()
get()
update()
pop()
"""
# --key()输出字典，返回一个视图对象
print(dc.keys())
# --values()
print(dc.values())
# --items()
print(dc.items())
# --get()
print(dc.get('name'))
# --update()
dc.update({'name':'emily'})
print("更新dc中，名字",dc)
# --pop()
dc.pop('age')
print("删除age键值",dc)
# # 删除不存在的键值会报错。KeyError: 'hobby'
# dc.pop('hobby')
# print("删除不存在的键值对",dc)

"""字典推导式：可以从任何以键值对作为元素的可迭代对象中构建出字典。
# 字典推导式： {k:v for k,v in ...}
练习：给定一个字典对象{'a':1, 'b':2, 'c':3},找出其中所有大于1的键值对，
同时value值进行平方和计算。
"""
# 字典推导式： {k:v for k,v in ...}
# 例子1
exe = {'a':1, 'b':2, 'c':3}
dsum = {k:v**2 for k,v in exe.items() if v>1}
print(dsum)
# 例子2
dc2 = {k:v for k,v in [("name","Harry Potter"), ("age", 18)]}
print(type(dc2), dc2)

# 进行key和value值的交换
# 输入：{'a':1, 'b':2, 'c':3};输出{1:'a', 2:'b'， 3:'c'}


# 练习题：
# x = True
# country_counter = {}
#
# def addone(country):
#     if country in country_counter:
#         country_counter[country] += 1
#     else:
#         country_counter[country] = 1
#
# addone('China')
# addone('Japan')
# addone('china')
#
# print(len(country_counter))